const db = require('../db/index')

// 在头部区域导入 bcryptjs 后，
// 即可使用 bcrypt.compareSync(提交的密码，数据库中的密码) 方法验证密码是否正确
// compareSync() 函数的返回值为布尔值，true 表示密码正确，false 表示密码错误
const bcrypt = require('bcryptjs')
//----------------------------------------------------------------
//根据id删除用户的处理函数
exports.deleteUser = (req, res) => {
    const sql = `delete from lab_users where Id=?`
    db.query(sql, req.body.id, (err, results) => {
        if (err) return res.cc(err)
        if (results.affectedRows !== 1) return res.cc('删除用户失败！')
        res.cc('删除用户成功！', 0)
    })
}
//----------------------------------------------------------------
//根据id审核用户的权限处理函数
exports.checkUser = (req, res) => {
    var access_power = null;
    var access_name = req.body.access_name;
    if (access_name == '被评者') {
        access_power = 0;
    } else if (access_name == '评分者') {
        access_power = 2;
    }
    // const sql = `select * from lab_users where Id=?`;
    const sql = `update lab_users set access=? where Id=?`
    db.query(sql, [access_power, req.body.id], (err, results) => {
        if (err) return res.cc(err)
        // console.log(results);
        if (results.affectedRows !== 1) return res.cc('审核用户权限失败！')
        res.cc('审核用户权限成功！', 0)
    })

}
//----------------------------------------------------------------
//根据id更新用户的信息处理函数
exports.updateScor = (req, res) => {
    const p1 = parseFloat(req.body.a1) +
    parseFloat(req.body.b1) +
    parseFloat(req.body.c1) +
    parseFloat(req.body.d1) +
    parseFloat(req.body.e1) +
    parseFloat(req.body.f1) +
    parseFloat(req.body.g1) +
    parseFloat(req.body.h1) +
    parseFloat(req.body.i1) +
    parseFloat(req.body.j1) +
    parseFloat(req.body.k1) +
    parseFloat(req.body.l1) +
    parseFloat(req.body.m1) +
    parseFloat(req.body.n1);
    const p2 = parseFloat(req.body.a2) +
    parseFloat(req.body.b2) +
    parseFloat(req.body.c2) +
    parseFloat(req.body.d2) +
    parseFloat(req.body.e2) +
    parseFloat(req.body.f2) +
    parseFloat(req.body.g2) +
    parseFloat(req.body.h2) +
    parseFloat(req.body.i2) +
    parseFloat(req.body.j2) +
    parseFloat(req.body.k2) +
    parseFloat(req.body.l2) +
    parseFloat(req.body.m2) +
    parseFloat(req.body.n2);
    // console.log(p1);
    // console.log(p2);
    // console.log(p1);
    // 定义查询 学号或工号 是否被占用的 SQL 语句
    const sql = `update lab_users set ? where Id=?`;
    db.query(sql, [req.body, req.body.id], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)

        // SQL 语句执行成功，但是影响行数不等于 1
        if (results.affectedRows !== 1) return res.cc('失败！')

        
        const sql = `update lab_users set p1 = ? ,p2 = ? where Id=? `;
        db.query(sql, [p1,p2,req.body.id], (err, results) => {
            // 执行 SQL 语句失败
            if (err) return res.cc(err)
            // SQL 语句执行成功，但是影响行数不等于 1
            if (results.affectedRows !== 1) return res.cc('失败！')
        // 更新用户信息成功
        res.cc('成功！', 0)
        })
    })
}
//更新纪实信息处理函数
exports.updateRecord= (req, res) => {
    // console.log(req.params);
    const sql = `update lab_users set ? where Id=?`;
    db.query(sql, [req.body, req.body.id], (err, results) => {
        if (err) return res.cc(err)
        if (results.affectedRows !== 1) return res.cc('失败！')
        res.cc('成功！', 0)
    })
}


//根据id更新用户的信息处理函数
exports.updateUser = (req, res) => {
    // console.log(req.body.id, req.body.sno);
    // 定义查询 学号或工号 是否被占用的 SQL 语句
    const sql = `select * from lab_users where Id<>? and sno=?`;
    // 执行查重操作
    db.query(sql, [req.body.id, req.body.sno], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)
        // console.log(results.length);

        // 判断 学号或工号是否被占用
        if (results.length === 1) return res.send({
            status: 1,
            message: '学号或工号被占用，请更换后重试！'
        })
        if (results.length === 1 && results[0].sno === req.body.sno) return res.cc('学号或工号被占用，请更换后重试！', 1)
        // 加密密码
        // req.body.password = bcrypt.hashSync(req.body.password, 10)
        // TODO：更新用户信息
        const sql = `update lab_users set ? where Id=?`;
        db.query(sql, [req.body, req.body.id], (err, results) => {
            // 执行 SQL 语句失败
            if (err) return res.cc(err)

            // SQL 语句执行成功，但是影响行数不等于 1
            if (results.affectedRows !== 1) return res.cc('更新用户信息失败！')

            // 更新用户信息成功
            res.cc('更新用户信息成功！', 0)
        })
    })
}
//根据id获取用户的信息处理函数
exports.getUser = (req, res) => {
    // console.log(req.params);
    const sql = `select * from lab_users where id=?`
    db.query(sql, req.params.id, (err, results) => {
        if (err) return res.cc(err)
        if (results.length !== 1) return res.cc('获取用户信息失败！')
        res.send({
            status: 0,
            message: '获取用户基本信息成功！',
            data: results[0],
        })
    })
}
//----------------------------------------------------------------
//获取所有用户的信息处理函数
exports.getUsers = (req, res) => {
    var pagenum = req.body.pagenum; //页码值
    var pagesize = req.body.pagesize; //每页显示数据
    var username = req.body.username;
    var sno = req.body.sno;
    const count_value = (pagenum - 1) * pagesize; //查询的起始值
    // console.log(pagenum);
    // console.log(pagesize);
    // console.log(count_value);
    // console.log(username);
    // console.log(sno);
    var sql = null;
    if (username) {
        sql = `select * from lab_users where username like "%${req.body.username}%" `
    }
    if (sno) {
        sql = `select * from lab_users where sno like "${req.body.sno}%" `
    }
    if (username && sno) {
        sql = `select * from lab_users where username like "%${req.body.username}%" and sno like "${req.body.sno}%" `
    }
    if (!username && !sno) {
        sql = `select * from lab_users order by id desc `
    }
    const countStr = `select count(*) as total from (${sql}) as usersinfo`;
    db.query(countStr, (err, results) => {
        if (err) return res.cc(err);
        const sum = results[0].total;
        // console.log(sum);
        sql += `limit ${count_value},${pagesize}`;
        db.query(sql, (err, results) => {
            if (err) return res.cc(err)
            if (results.length == 0) return res.cc('没有相关信息！')
            // console.log(results);
            res.send({
                status: 0,
                message: '获取用户基本信息成功！',
                data: results,
                total: sum,
            })
        })
    })
}
//----------------------------------------------------------------
// 获取用户基本信息的处理函数
exports.getUserInfo = (req, res) => {
    // 导入数据库操作模块

    // 根据用户的 id，查询用户的基本信息
    // 注意：为了防止用户的密码泄露，需要排除 password 字段
    const sql = `select id, username, sno,college,aclass, phone_number,email, user_pic from lab_users where id=?`
    // 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
    db.query(sql, req.user.id, (err, results) => {
        // 1. 执行 SQL 语句失败
        if (err) return res.cc(err)

        // 2. 执行 SQL 语句成功，但是查询到的数据条数不等于 1
        if (results.length !== 1) return res.cc('获取用户信息失败！')

        // 3. 将用户信息响应给客户端
        res.send({
            status: 0,
            message: '获取用户基本信息成功！',
            data: results[0],
        })
    })
}

// 更新用户基本信息的处理函数
exports.updateUserInfo = (req, res) => {
    // console.log(req.body);
    const sql = `update lab_users set ? where id=?`
    db.query(sql, [req.body, req.body.id], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)

        // 执行 SQL 语句成功，但影响行数不为 1
        if (results.affectedRows !== 1) return res.cc('修改用户基本信息失败！')

        // 修改用户信息成功
        return res.cc('修改用户基本信息成功！', 0)
    })
}

// 重置密码的处理函数
exports.updatePassword = (req, res) => {
    // 定义根据 id 查询用户数据的 SQL 语句
    const sql = `select * from lab_users where id=?`
    // 执行 SQL 语句查询用户是否存在
    db.query(sql, req.user.id, (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)

        // 检查指定 id 的用户是否存在
        if (results.length !== 1) return res.cc('用户不存在！')

        // TODO：判断提交的旧密码是否正确
        // 判断提交的旧密码是否正确
        const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
        if (!compareResult) return res.cc('原密码错误！')


        // 定义更新用户密码的 SQL 语句
        const sql = `update lab_users set password=? where id=?`

        // 对新密码进行 bcrypt 加密处理
        const newPwd = bcrypt.hashSync(req.body.newPwd, 10)

        // 执行 SQL 语句，根据 id 更新用户的密码
        db.query(sql, [newPwd, req.user.id], (err, results) => {
            // SQL 语句执行失败
            if (err) return res.cc(err)

            // SQL 语句执行成功，但是影响行数不等于 1
            if (results.affectedRows !== 1) return res.cc('更新密码失败！')

            // 更新密码成功
            res.cc('更新密码成功！', 0)
        })
    })
}

// 编辑用户的密码
exports.editPassword = (req, res) => {
    const id = req.body.id
    const password = req.body.password
    // console.log(id);
    // console.log(password);
    const sql = `select * from lab_users where id=?`
    db.query(sql, id, (err, results) => {
        if (err) return res.cc(err)
        if (results.length !== 1) return res.cc('用户不存在！')
        // 定义更新用户密码的 SQL 语句
        const sql = `update lab_users set password=? where id=?`

        // 对新密码进行 bcrypt 加密处理
        const newPwd = bcrypt.hashSync(password, 10)
        // 执行 SQL 语句，根据 id 更新用户的密码
        db.query(sql, [newPwd, id], (err, results) => {
            // SQL 语句执行失败
            if (err) return res.cc(err)

            // SQL 语句执行成功，但是影响行数不等于 1
            if (results.affectedRows !== 1) return res.cc('更新密码失败！')

            // 更新密码成功
            res.cc('更新密码成功！', 0)
        })
    })
}

// 更新用户头像的处理函数
exports.
updateAvatar = (req, res) => {
    // console.log(req);
    const sql = 'update lab_users set user_pic=? where id=?'
    db.query(sql, [req.body.avatar, req.user.id], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)

        // 执行 SQL 语句成功，但是影响行数不等于 1
        if (results.affectedRows !== 1) return res.cc('更新头像失败！')

        // 更新用户头像成功
        return res.cc('更新头像成功！', 0)
    })
}